python爬虫递归爬取url
时间: 2023-11-12 07:44:15 浏览: 152
可以使用递归函数实现,以下是一个示例代码:
```python
import requests
from bs4 import BeautifulSoup
def crawl(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
print("正在爬取:", url)
# 在这里可以对页面进行解析,提取信息等操作
for link in soup.find_all('a'):
new_url = link.get('href')
if new_url and new_url.startswith('http'): # 只爬取以http开头的链接
crawl(new_url) # 递归调用
if __name__ == '__main__':
start_url = 'https://www.example.com'
crawl(start_url)
```
注意要加上判断条件,避免爬取到重复的链接或者死循环。另外,爬取网站时需要遵守相关法律法规和网站的规定,不得进行非法爬取或者恶意攻击。
相关问题
Python爬虫要爬取用户的所有微博,但是微博有很多页,每页的URL都不同,这样在写代码的时候要怎么搞URL
在Python编写爬虫时,如果需要爬取用户所有微博且分多页,你需要设计一种策略来处理动态生成的URL。这里通常会采用递归或者循环的方式,结合列表推导式或者循环结构来构建请求序列。以下是一个基本步骤:
1. **初始化**:首先获取第一页的内容,从中解析出下一页的链接,通常这会在HTML结构中的某个部分,比如`<a>`标签内的`href`属性。
```python
url_template = 'https://weibo.com/user/home?containerid={page_num}'
start_page = 1
initial_links = [url_template.format(page_num=start_page)]
```
2. **提取链接**:对于每一页面,提取出所有链接,如果包含“更多”、“下一页”等字样,那可能是后续的页面链接。
```python
def extract_next_links(response):
# 使用BeautifulSoup或其他库解析HTML
links = response.css('a.next') or response.css('.pagination a')
return [link.attrib['href'] for link in links]
# 这里假设你已经有了一个get_html_content函数用于发送GET请求并返回HTML内容
next_links = extract_next_links(get_html_content(initial_links[0]))
```
3. **构建递归或循环**:将提取到的链接添加到新的请求序列中,并继续处理直到没有更多的链接为止。可以使用递归来简化代码,也可以用for循环实现。
```python
if next_links:
# 如果有下一个链接
all_links = initial_links + [url_template.format(page_num=int(link.split('=')[1])) for link in next_links]
# 递归或循环处理新链接
for link in all_links:
process_link(link)
else:
# 所有链接抓完,结束爬取
print("所有微博已抓取完成")
```
python爬虫递归网页
在Python中,爬取递归网页通常涉及到深度优先搜索(DFS)或广度优先搜索(BFS)算法的应用,尤其是当你需要抓取的是有链接嵌套结构的网站。你可以使用requests库获取网页内容,BeautifulSoup或lxml库解析HTML,然后通过`find_all()`或`.select()`等方法找到所有的链接。
以下是一个简单的递归函数示例,使用BeautifulSoup和Python:
```python
import requests
from bs4 import BeautifulSoup
def crawl(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 获取所有a标签,也就是链接
links = soup.find_all('a', href=True)
for link in links:
# 构造新的链接并检查是否已爬过(这里假设有一个visited_links列表)
new_url = link['href']
if new_url not in visited_links:
visited_links.append(new_url) # 添加新链接到已访问列表
print(f"Crawling: {new_url}")
# 递归地对新链接再次调用crawl函数
crawl(new_url)
# 起始点,例如百度首页
start_url = "https://www.baidu.com"
crawl(start_url)
```
阅读全文