houziaipangqi

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  

  初级的爬虫,此处不涉及其他解析工具,用的是正则表达式,因为这个是必须要学的,请求网页用的是requests库。

 

#首先导入json、requests、re、time等模块,此处还用到了异常处理。
import
json import requests from requests.exceptions import RequestException import re import time #首先定义一个方法,将网页源码的请求头信息加入,此处用到了异常处理机制try和except,判断状态码,200就是响应成功的意思,最后返回响应信息。 def get_one_page(url): try:
     #请求头的信息可以在网页源代码中找到 headers
= { 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' } response = requests.get(url, headers=headers)
     #此处判断响应的状态码
if response.status_code == 200: return response.text return None except RequestException: return None
#这里我们再定义一个方法,这个方法中用到的就是正则表达式,用于匹配你上文中接收到的源码信息,解析出你想要的东西,再加入一个生成器,依次输出得到的结果
def parse_one_page(html):
   #正则表达式匹配,我们首先要定义一个正则匹配的方法,然后下面用到的findall中传入的参数,第一个是我们定义的正则匹配方法,第二个就是我们爬下来的源代码 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] }
#我们将匹配好的内容写入文件,ensure_ascii=False用于保证输出的是中文而不是unicode编码。json库的dumps()方法实现字典序列化
def write_to_file(content): with open('result.txt', 'a', encoding='utf-8') as f: f.write(json.dumps(content, ensure_ascii=False) + '\n')
#这里我们可以看到,猫眼电影在翻页的时候,它的url除了最后一个offset在变,前面的都没有变,所以此处可以在url后面加一个offset变量,用于翻页。
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)
#由于猫眼电眼的一页只展示10部电影,所以我们要做一个for循环,最后执行。
if __name__ == '__main__': for i in range(10): main(offset=i * 10) time.sleep(1)

 

posted on 2018-09-13 17:39  houziaipangqi  阅读(151)  评论(0编辑  收藏  举报