爬虫学习笔记1——基本思路
源代码来自崔庆才《python3网络爬虫开发实战》
获取网页html
使用requests库的get(url , headers)方法headers是用户代理,在浏览器地址栏输入“about:version”就可看到。代码如下:
def get_one_page(url):
try:
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)'
+'AppleWebKit/537.36 (KHTML, like Gecko)'
+'Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3742.400'
+'QQBrowser/10.5.3864.400'
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
从html中提取所需信息
使用re.compile()制作匹配模板pattern,括号中填相应的正则表达式。
使用re.findall(pattern,html)提取信息.
代码如下:
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name">'
+ '<a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime'
+'">(.*?)</p>.*?integer">(.*?)</i>.*?fraction"'
+'>(.*?)</i>.*?</dd>',re.S)
items = re.findall(pattern , html)
for item in items:
yield{
'index':item[0],
'image':item[1],
'title':item[2],
'actor':item[3].strip()[3:],
'time' :item[4].strip()[5:],
'score':item[5] + item[6]
}
关于此处的yield:
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator
看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用
next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从
yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield
返回当前的迭代值。yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next()
的值,不仅代码简洁,而且执行流程异常清晰。
以上引用自runoob教程。
简单说,此处的yield后面是一个字典,函数每次return一个字典形式的item,具体到结果中为一个电影的所有信息。for循环执行完毕后,一个网页的所有要提取的信息就都以字典的形式提取出来了。
存储信息
with open(‘文件名(包括格式)’,写入方式,encoding=‘编码’)as f:打开一个文件作为实例对象,用f表示。f调用write()方法写入已经提取出来的信息。
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
f.write(json.dumps(content,ensure_ascii=False)+'\n')
此处json.dumps()的作用是,将python对象转为json字符串的形式。
将json字符串转为python对应的数据类型的方法是json.load()
主函数中给出要爬取的网页的url,将各部分连接
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
if __name__ == '__main__':
for i in range(10):
main(offset = i*10)
time.sleep(1)
来源:CSDN
作者:过气老娼
链接:https://blog.csdn.net/weixin_44874830/article/details/103990185