基础配置
导入相关包并设置爬取的路径和基本信息
import multiprocessing
import requests
import logging
import re
from urllib.parse import urljoin
logging.basicConfig(level=logging.INFO,format="%(asctime)s-%(levelname)s:%(message)s")
BASE_URL="https://ssr1.scrape.center"
TOTAL_PAGE=10
爬取源代码方法
def scrape_page(url):
logging.info("scraping %s...",url)
try:
response=requests.get(url)
if response.status_code==200:
return response.text
logging.error("get invalid status code %s while scraping %s",response.status_code,url)
except requests.RequestException:
logging.error("error occurred while scraping %s",url,exc_info=True)
解析:传入一个路径参数,根据参数进行请求,返回html文件的源码。
定义列表页的爬取方法
def scrape_index(page):
index_url=f'{BASE_URL}/page/{page}'
return scrape_page(index_url)
根据网站可以观察出网站的分页是基本路径+page+页码数,这样就可以获取到所有的路径。
解析列表页的方法
def parse_index(html):
pattern=re.compile('<a.*?href="(.*?)".*?class="name">')
items=re.findall(pattern,html)
if not items:
return []
for item in items:
detail_url=urljoin(BASE_URL,item)
logging.info('get detail url %s',detail_url)
yield detail_url
接受一个html代码,然后定义一个提取标题超链接的正则表达式,我们使用.?来进行非贪婪通用匹配任意字符,在href属性的引号之间使用了分组匹配(.?)正则表达式,这样我们可以在href中获取href中的值,再调用 re库中的findall方法,传入构造的pattern对象,第二个参数传入html,这样便会得到匹配的结果,并赋值为items,如果item为空。这样我们可以得到详情页的url