山东大学软件工程应用与实践——ECommerceCrawlers代码分析(八)

山东大学软件工程应用与实践——ECommerceCrawlers代码分析(八),第1张

山东大学软件工程应用与实践——ECommerceCrawlers代码分析(八) 2021SC@SDUSC

目录

一、摘要

二、“souhu_new.py”文件核心代码分析

1.部分一

2.部分二

三、“run_main.py”文件核心代码分析 

1.部分一

2.部分二

四、总结


一、摘要

本篇博客作为“SohuNewCrawler”项目核心代码分析的第三篇。

我将接着上篇继续对“souhu_new.py”文件剩余核心代码以及“run_main.py”文件部分代码进行分析。

二、“souhu_new.py”文件核心代码分析 1.部分一
if url not in self.url_set:
   self.url_set.add(url)
   print(url)
   self.logMessage.put('【新闻】【{}】{}'.format(url_time,title))
   print('新增数据:', title)
   self.dburl.insert({"url": url, "time": url_time, "flag": 0, "title": title, "type": 
   type_name})

 对于之前创建的url_set来说,因为set是无重复的集合,里面存储的都是待爬取的新闻链接。

之前 url = parse.urljoin('http://m.sohu.com', per_new.get("url")) ,对于这些拼接出来的url,在self.url_set中判断,若url不在这个集合中,则添加进去,然后控制台输出该url。

将之前存储的新闻标题以及时间按照标准格式存储并存放在self.logMessage中,同时也将“新增数据”输出。

最后将上述得到的url,时间,标题,flag(标识状态),新闻类型一起通过self.dburl插入数据库中。

2.部分二
    def run(self,logMessage,errMessage):
        self.logMessage=logMessage
        self.errMessage=errMessage
        for base_url in new_url_list:
            for i in range(1, 130):
                if i==87:
                    continue
                new_url = '{base_url}{i}?size={size}'.format(base_url=base_url, i=str(i), 
                size=size)
                self.url_queue.put(new_url)

在run()函数中,在new_url_list中以url进行for循环。并且在内部有一整数for循环,i从1到130。new_url被赋值为'{base_url}{i}?size={size}'.format(base_url=base_url, i=str(i), size=size)。 

new_url的这个格式是对应不同的新闻接口。

例:"http://v2.sohu.com/integration-api/mix/region/84?size=100"

这其中的84?size=100即对应的是{i}?size={size},而前面的base_url即对应84前面的部分。

 

给new_url赋完值之后再将该new_url放入url队列self.url_queue中。

三、“run_main.py”文件核心代码分析 

“run_main.py”文件主要是针对网站主要部分进行爬取 *** 作。

1.部分一
class NewsClawer():
    def __init__(self):
        self.dburl = MongoUrl()
        self.dbarticle = MongoArticle()
        self.url_set = set()

        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
            (KHTML, like Gecko) Chrome/69.0.3497.12 Safari/537.36"}

    def init_set(self):
        url_list = self.dburl.select({"flag": 1})
        for url in url_list:
            self.url_set.add(url.get('url'))

 在NewsClawer类中,_init_函数主要负责用来初始化相关值,对dburl,dbarticle进行初始化(值来自MongoDB数据库),创建一个set集合url_set。

将爬取时的headers中的“User-Agent”自定义。

自定义headers中的“User-Agent”的作用是为了处理一些简单的反爬 *** 作。

User-Agent是一种请求头,服务器可以从User-Agent对应的值中来识别用户端使用的 *** 作系统、浏览器、浏览器引擎、 *** 作系统语言等等。
浏览器User-Agent通常由浏览器标识、渲染引擎标识、版本信息这三部分来构成。可以通过检查网页在这里查看User-Agent请求头值。

 在向服务器发送的网络请求中,User-Agent是客户端用于表明身份的一种标识。所以,反爬虫工程师可以将一些爬虫程序的请求头放入服务器访问的黑名单中,当有网络请求时通过检测User-Agent请求头域值来判断客户端的类型,将其与黑名单中数据进行比对,一致时则拒绝其访问,从而有效的限制一些爬虫程序。

url_list = self.dburl.select({"flag": 1})。

将数据库中存储的url进行条件查询,找出那些还未被爬取过的url并存进url_list中,而后将url_list中的url添加进url_set中。

2.部分二
    def req_news_command(self):
        while True:
            start_url_obj = self.dburl.find_one_update_flag1()

            if not start_url_obj:
                print('url已经全部扫描完毕')
                time.sleep(50)
                continue
            start_url = start_url_obj.get('url')
            news_time = start_url_obj.get('time', '')
            news_title = start_url_obj.get('title', '')
            news_type = start_url_obj.get('type', '')

            print('起始url', start_url,news_type,news_time,news_title)

 在req_news_command函数中。self.dburl调用find_one_update_flag1()函数。

    def find_one_update_flag1(self):
        return self.collection.find_one_and_update({"flag": 0}, {'$set': {"flag": 1}})

当url全部扫描完毕之后,将start_url_obj中的url,time,title,type均赋给start_url,news_time,news_title,news_type。最后将起始url输出。

四、总结

通过对“souhu_news.py”的分析,我对爬虫的主体过程有了一个比较清晰的了解,也收获了在爬虫与数据库应用之间的知识,收获颇丰。

我将在下一篇博客继续对“run_main.py”文件剩余核心代码进行分析,也将是本项目的最后一篇。 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5572165.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-14
下一篇2022-12-14

发表评论

登录后才能评论

评论列表(0条)

    保存