# 导入基本库
import requests
import logging
import re
from urllib.parse import urljoin
# 日志文件格式
logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s:%(message)s')
# 基本URL设置
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 scraoing %s',url,exc_info=True)
# 在scrape_age方法的基础上,我们来定义列表页的爬取方法:
def scrape_index(page):
index_url=f'{BASE_URL}/page/{page}'
return scrape_page(index_url)
# 获取HTML代码之后,下一步就是解析列表页,并得到每部电影的详情页URL,实现如下
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
# 这里我们定义了parse_index方法,他接受一个参数html,即列表页的HTML代码
# 我们对上面的方法串联调用一下,实现如下:
def main():
for page in range(1,TOTAl_PAGE+1):
index_html=scrape_index(page)
detail_urls=parse_index(index_html)
logging.info('detail urls %s',list(detail_urls))
if __name__ == '__main__':
main()
这是我按照书上的代码一个一个敲进去的,但是在调试的时候出现:expected string or bytes-like object, got 'NoneType' 异常 ,异常出现的代码区域是: items=re.findall(pattern,html) 不知道为啥。请教各路大神,我究竟错在哪里?