nanrenne 发表于 2020-3-23 00:06:10

爬虫一些不懂的对方求教

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,
                        'image':item,
                        'title':item,
                        'actor':item.strip(), #if len(item) > 3 else '',
                        'time':item.strip(), #if len(item) >5 else '',
                        'score':item + item
                }

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')
                f.close()

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)

粗体部分为我不解的地方,求教各位大佬
我不明白的地方是

content是什么?它是什么参数?上下文中都没有,在哪里继承或者说是传递过来的>? 程序为什么会被执行,程序是至上而下执行的,可是这个 write_to_file函数没有被调用啊

还有一个是最下面的什么是if __name__ == '__main__':
双下划线代表什么?为什么要这样写,直接写main()可不可以?

qiuyouzhi 发表于 2020-3-23 07:41:18

1,看main的最后一行
2,小甲鱼老师讲过的,防止别的程序调用main(如果你导入了这个程序)

一个账号 发表于 2020-3-23 09:41:07

1. content 是一个参数,是之后传进去的

2. 是防止别人导入这个模块自动调用 main() 函数:

>>> import os
>>> os.__name__
'os'
>>> __name__
'__main__'

nanrenne 发表于 2020-3-23 11:43:36

qiuyouzhi 发表于 2020-3-23 07:41
1,看main的最后一行
2,小甲鱼老师讲过的,防止别的程序调用main(如果你导入了这个程序)

感谢,那么(content)我可不可以写成别的,比如 write_to_file(x1)

qiuyouzhi 发表于 2020-3-23 11:44:43

nanrenne 发表于 2020-3-23 11:43
感谢,那么(content)我可不可以写成别的,比如 write_to_file(x1)

可以啊,只要把content改成x1就行

nanrenne 发表于 2020-3-23 11:47:46

本帖最后由 nanrenne 于 2020-3-23 11:51 编辑

一个账号 发表于 2020-3-23 09:41
1. content 是一个参数,是之后传进去的

2. 是防止别人导入这个模块自动调用 main() 函数:

我尝试输入这些
>>> import os   导入os
>>> os.__name__   os的名字
'os'   就是os
>>> __name__名字的名字
'__main__'   就是main

是我这样理解吗

如果我导入的是re模块,其实也是一样的

百度了下 说的是 如果你的文件是从外部导入的,则外部函数内容不会被执行
如果你的文件是在内部的,则代码块会被执行

那么按照这个意思,其实我主题的那些代码完全也可以不需要if __name__ == '__main__':
直接用main() 也可以直接调用main入口函数运行整个程序的把

一个账号 发表于 2020-3-23 11:54:49

nanrenne 发表于 2020-3-23 11:47
我尝试输入这些
>>> import os   导入os
>>> os.__name__   os的名字



解压缩 demo.zip 运行 mian.py,然后看看源代码你就懂了:

zltzlt 发表于 2020-3-23 13:04:09

1. content 是一个参数

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)

2. https://www.cnblogs.com/yaohong/p/8660209.html
页: [1]
查看完整版本: 爬虫一些不懂的对方求教