文章

猫眼电影Top100的爬取代码

从下午大概3点半到现在0:24分,就围着这些代码敲和看了,有部分不明白,例如content是个什么玩意.不过照着敲了,到现在代码运行起来不报错,可是程序也一直不给反应,不知道为什么,记录一下,免得遗失后够敲了,要敲很久.

import re
import requests
import json
import time
from requests.exceptions import RequestException
def get_one_page(url):
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
        response = requests.get(url,headers=headers)
        print(response.status_code)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


def parse_one_page(html):
    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star>*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>',re.S)
    items = re.findall(pattern,html)
    print(items)
    for item in items:
        yield{
            'index':item[0],
            'image':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:], #if len(item[3]) > 3 else '',
            'time':item[4].strip()[5:], #if len(item[4]) >5 else '',
            'score':item[5] + item[6]
        }

def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:
        print(type(json.dumps(Conntent)))
        f.write(json.dumps(content,ensure_ascii=False)+'\n')

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)

20分钟后问题已找出,原因:正则表达式错误
替换为

    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
    + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
    + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>',re.S)

还有一个问题,猫眼电影当你访问的时候第一次是需要验证的,然后我是直接用chrome打开滑动的验证,否则程序访问也不对,但是最近一次是很久都没有去手动划了,不知道为什么程序依然可以爬.我程序设置的User-Agent就是我自己chrome的User-Agent

2020年3月23日凌晨1点15分更新以下内容
草,有的时候你会发现一个空格的缩进,一个TAB的缩进,或者函数末尾没有加冒号,或者你没加单引号,总之很多或者,就会出问题.
我的意思是,其实我的疑惑是这样的一个问题,但是却隔了那么久我才发现,原来是这样的.
我有去鱼C求助的,结果刚发完帖子,被告知审核中,然后自己研究解决了,下边是发帖的求助内容:
content是什么?它是什么参数?上下文中都没有,在哪里继承或者说是传递过来的>? 程序为什么会被执行,程序是至上而下执行的,可是这个 write_to_file函数没有被调用啊

还有一个是最下面的 什么是if name == 'main':
双下划线代表什么?为什么要这样写,直接写main()可不可以?
其实name和main这个问题我百度已经解决了,按照这个程序直接写main(),应该也是可以的.应该是吧,我也不知道,以后慢慢解决.因为main下边好像还有内容,改成main()的话下边的内容我就不知道怎么搞进来了.

然后是第一个问题 content,在main(offset)函数的最后一行,它是有被调用过的,是我自己没看到.

在接下来是2020年3月23日修改的代码,我看那个if name=='main':下面的逻辑实在是不舒服,于是我就不用它了,我直接改到了main()函数里面,经过测试还是可以的,我还特意删除了time.sleep的等待时间,依然可以.
然后其实我发现还是写在if name=='main'里面,看着比较简洁.囧....
不过至少表明自己把这个实例和之前不用if name 的实例都看懂且能操作了

import re
import requests
import json
import time
from requests.exceptions import RequestException
def get_one_page(url):
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
        response = requests.get(url,headers=headers)
        print(response.status_code)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


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>',re.S)
    items = re.findall(pattern,html)
    print(items)
    for item in items:
        yield{
            'index':item[0],
            'image':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:], #if len(item[3]) > 3 else '',
            'time':item[4].strip()[5:], #if len(item[4]) >5 else '',
            'score':item[5] + item[6]
        }

def write_to_file(content):
    with open('xiugai.txt','a',encoding='utf-8') as f:
        #print(type(json.dumps(Conntent)))
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()

def main():
    urls = ['http://maoyan.com/board/4?offset=']
    for i in range(10):
        urls.append(f'http://maoyan.com/board/4?offset={i * 10}')
        # time.sleep(1)
        print(urls)
    for url in urls:
        html = get_one_page(url)
        for item in parse_one_page(html):
            print(item)
            write_to_file(item)

#  if __name__ == '__main__':
main()
#   for i in range(10):
#       main(offset=i * 10)
#       time.sleep(1)

原文来自:猫眼电影Top100的爬取代码,尊重自己,尊重每一个人;转发请注明来源!
0 0

发表评论