爬虫学习笔记1——基本思路

爬虫学习笔记1——基本思路

  • 获取网页html
    • 从html中提取所需信息
    • 存储信息
    • 主函数中给出要爬取的网页的url,将各部分连接

源代码来自崔庆才《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('
.*?board-index.*?>(\d+).*?data-src="(.*?)".*?name">' + '(.*?).*?star">(.*?)

.*?releasetime'
+'">(.*?)

.*?integer">(.*?).*?fraction"'
+'>(.*?).*?
'
,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)

你可能感兴趣的:(爬虫学习笔记)