之前暑假之余一直在学习python的爬虫,但由于忙于acm的训练,一直没有时间好好的敲代码,现在终于空下来了,想把之前的教程上面的项目实战写一遍,顺便温习一下学过的 内容。
本次爬虫主要利用了requests模块进行网站的链接和网页获取,利用re模块的正则表达式进行特定内容的获取。
我们先打开链接:http://maoyan.com/board/4, 利用开发者模式查看网页的源代码,分析源代码。
我们需要爬取的目标是每个电影的名称,排名,演员,上映时间,封面图片,评分等内容,
我们利用开发者工具查看源代码:
匹配过程
我们可以发现每一个电影的信息都在一个 dd 标签里面,于是我们可以利用正则表达式来提取到dd里面的内容。
大致的提取过程是先匹配到dd标签然后通过非贪婪模式匹配到我们需要的内容,最后利用group函数得到我们匹配的地方。
我使用的正则表达式是
1 2 pattern = re.compile ('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?class="name"><a.*?>(.*?)' '</a>.*?"star">(.*?)</p>.*?>(.*?)</p>.*?<i class="integer">(.*?)</i><.*?>(.*?)</i>.*?</dd>' , re.S)
表示的意思是先匹配到dd标签,然后使得非贪婪匹配和通配符匹配中间过程的的任意内容,然后再提取我们需要的内容,一直这样直到我们所有的内容都收到,re.S的意思是使 . 匹配包括换行在内的所有字符。
具体关于正则表达式的内容可以看我之前的博客:https://woodcb.com/2018/python的re库学习/
获取网页
这个网站似乎经常被爬,所以有了很多的反爬虫措施,我们必须设置User-Agent才能进行访问,并且如果同一个ip地址访问次数太多的话,这个ip地址也会被封。
关于设置User-Agent和代理ip的可以看我之前的文章:https://woodcb.com/2018/python的requests库用于爬虫的基本知识/
或者直接看代码也可以。
我们点击下一页,发现地址栏里面的有一个参数一直在变换,所以我们可以确定那个参数是用于翻页的,于是我们可以通过传入这个参数来改变页数,从而达到获取每一页的内容的目的。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import requestsimport reimport timedef get_one_page (url ): proxy = {'http' : '218.14.115.211:3128' } header = {'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' } response = requests.get(url, headers=header, proxies=proxy) print (response.status_code) if response.status_code == 200 : return response.text return None def process_html (html ): pattern = re.compile ('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?class="name"><a.*?>(.*?)' '</a>.*?"star">(.*?)</p>.*?>(.*?)</p>.*?<i class="integer">(.*?)</i><.*?>(.*?)</i>.*?</dd>' , re.S) items = re.findall(pattern, html) return items def out (items ): for item in items: x = ({ 'rank' : item[0 ], 'image' : item[1 ], 'name' : item[2 ].strip(), 'actors' : item[3 ].strip(), 'time' : item[4 ].strip(), 'score' : item[5 ] + item[6 ].strip() }) print (x) if __name__ == '__main__' : url = 'http://maoyan.com/board/4?offset=' for i in range (10 ): html = get_one_page(url+str (i*10 )) if html is not None : items = process_html(html) out(items) else : print ("ERROR" ) time.sleep(1 )