爬虫——三个小实战

贴吧爬取

写代码前,构思需要的功能块;写代码时,把各个功能模块名提前写好

初始化

初始化必要参数,完成基础设置 爬取百度贴吧lol吧:爬取地址中的get参数须传递(可以指定不同主题的贴吧和页码)

  • 主题名
  • 初始网址
  • 请求头

生成网址

生成每一页的路由地址

  • 根据列表生成式生成多个页面的地址

下载

get请求给每一页的地址,爬取页面

保存

保存爬取结果到文件中,把每一页爬取结果写入到对应名字的文件中

控制流程

将以上爬取操作封装到run函数中,方便外部对象调用,以后会在此添加多线程

  • 生成要爬取的每一页的路由地址
  • 通过for循环遍历每一个路由地址
  • 对每个路由地址进行爬取和获取页码操作,并进行保存

源码

 1 import requests
 2
 3 class TiebaSpider:
 4     def __init__(self, tieba_name_crawl):
 5         """
 6         初始化必要参数,完成基础设置
 7         爬取百度贴吧lol吧:爬取地址中的get参数须传递(可以指定不同主题的贴吧和页码)
 8         """
 9         self.tieba_name = tieba_name_crawl
10         self.url_base = ‘https://tieba.baidu.com/f?kw=‘ + tieba_name_crawl + ‘&ie=utf-8&pn={}‘
11         self.headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0‘}
12
13     def make_url(self):
14         """
15         生成每一页的路由地址
16         :return:(列表生成式)
17         """
18         return [self.url_base.format(i) for i in range(4)]
19
20     def download_url(self, url_str):
21         """
22         get请求给每一页的地址,爬取页面
23         :param url_str: 每一页的路由地址
24         :return: 爬取的结果
25         """
26         result = requests.get(url_str, headers=self.headers)
27         return result.text
28
29     def save_result(self, result, page_num):
30         """
31         保存爬取结果到文件中
32         :param result: 每一页的爬取结果
33         :param page_num: 页码,方便分类保存
34         :return: 把每一页爬取结果写入到对应名字的文件中
35         """
36         # with open(‘./download/lol‘ + str(page_num) + ‘.html‘, ‘ab‘) as f:
37         #     f.write(result.encode(‘utf-8‘))
38         file_path = ‘./download/{}~第{}页.html‘.format(self.tieba_name,page_num)
39         with open(file_path,‘wb‘) as f:
40             f.write(result.encode(‘utf-8‘))
41
42     def run(self):
43         """
44         将以上爬取操作封装到run函数中,方便外部对象调用,以后会在此添加多线程
45         · 生成要爬取的每一页的路由地址
46         · 通过for循环遍历每一个路由地址
47         · 对每个路由地址进行爬取和获取页码操作,并进行保存
48         :return:
49         """
50         url_lists = self.make_url()
51         for url_str in url_lists:
52             result_str = self.download_url(url_str)
53             p_num = url_lists.index(url_str) + 1
54             self.save_result(result=result_str,page_num=p_num)
55
56 if __name__ == ‘__main__‘:
57     tieba_spider = TiebaSpider(‘lol‘)
58     tieba_spider.run()

爬取糗事百科

 1 import requests
 2 from bs4 import BeautifulSoup
 3 import lxml.html
 4
 5 class QiushiSpider:
 6     def __init__(self):
 7         """
 8         初始化必要参数,完成基础设置
 9         """
10         # self.tieba_name = qiushi_name_crawl
11         # https: // www.qiushibaike.com / 8
12         # hr / page / 2 /
13         self.url_base = ‘https://www.qiushibaike.com/8hr/page/{}/‘
14         # self.url_base = ‘https://tieba.baidu.com/f?kw=‘ + qiushi_name_crawl + ‘&ie=utf-8&pn={}‘
15         self.headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0‘}
16
17     def make_url(self):
18         return [self.url_base.format(i) for i in range(4)]
19
20     def download_url(self, url_str):
21         result = requests.get(url_str, headers=self.headers)
22         #----------
23         # html = lxml.html.fromstring(result.text)
24         # html_data = html.xpath(‘//div[@class="content"]/span[1]/text()‘)
25         # data_all = []
26         # # for h in html_data:
27         # #     data_all.append(h)
28         # return html_data
29         #-----------
30         return result.text
31
32     def save_result(self, result, page_num):
33         with open(‘./download/qiushi‘ + str(page_num) + ‘.html‘, ‘ab‘) as f:
34             f.write(result.encode(‘utf-8‘))
35
36
37 # qiushi = QiushiSpider()
38 # qiushi_url = qiushi.make_url()
39 # j = 1
40 # for i in qiushi_url:
41 #     qiushi_text = qiushi.download_url(url_str=i)
42 #     qiushi.save_result(result=qiushi_text, page_num=j)
43 #     j += 1

爬取国家信息

BeautifulSoup方式

 1 import requests
 2 from bs4 import BeautifulSoup
 3 class CountrySoup:
 4     def __init__(self,country_name):
 5         self.country_name = country_name
 6         self.url_base = ‘http://example.webscraping.com/places/default/view/{}‘.format(self.country_name)
 7         self.headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0‘,}
 8
 9     def download_url(self):
10         result = requests.get(self.url_base,headers=self.headers)
11         soup = BeautifulSoup(result.text,‘lxml‘)
12         tr = soup.find(attrs={‘id‘:"places_country__row"})
13         print(tr,type(tr))
14         td = tr.find(attrs={‘class‘:"w2p_fw"})
15         print(td,type(td))
16
17         print(td.text)

lxml方式

 1 class CountrySpider:
 2     def __init__(self,country_name):
 3         self.country_name = country_name
 4         self.url_base = ‘http://example.webscraping.com/places/default/view/{}‘.format(self.country_name)
 5         self.headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0‘,}
 6
 7     def download_url(self,url_str):
 8         result = requests.get(url_str,headers=self.headers)
 9         html = lxml.html.fromstring(result.text)
10         data_country = html.xpath(‘//tr[@id="places_country__row"]/td[@class="w2p_fw"]/text()‘)
11         data_capital = html.xpath(‘//tr[@id="places_capital__row"]/td[@class="w2p_fw"]/text()‘)
12         data_area = html.xpath(‘//tr[@id="places_area__row"]/td[@class="w2p_fw"]/text()‘)
13         data_all = [‘国家:‘+data_country[0],‘首都:‘+data_capital[0],‘国土面积:‘+data_area[0]]
14         return data_all
15         # print(html_data)
16
17     def save_result(self,result):
18         print(type(result),result)
19         for r in result:
20             r = r + ‘\n‘
21             with open(‘./country.txt‘,‘ab‘) as f:
22                 f.write(r.encode(‘utf-8‘))
23         # with open(‘./country.txt‘,‘ab‘) as f:
24         #     f.writelines(result)
25     def run(self):
26         result = self.download_url(self.url_base)
27         self.save_result(result)
28
29
30 if __name__ == ‘__main__‘:
31     # c = CountrySpider(‘Bolivia-27‘)
32     # c.run()
33     s = CountrySoup(‘Bolivia-27‘)
34     s.download_url()

原文地址:https://www.cnblogs.com/siplips/p/9688173.html

时间: 2024-10-05 05:41:15

爬虫——三个小实战的相关文章

Wince6.0应用开发:三、小技巧揭秘

在Wince6.0的应用开发过程中,掌握一些使用的小技巧,必定会事半功倍 那么,你做好心里准备了吗?3.2.1. 技巧一:我会告诉你你为Wince开发的程序可以在你的电脑上运行!                     这个技巧的用途有两个 1.测试程序能否达到预期效果 还记得我们上一篇帖子在模拟上用的小程序吗? 我们现在PC上运行一下 2.捕捉在Wince上不显示的异常 有时候,在Wince上运行应用程序,即使出错了也不会抛出异常,当这个时候我们只需要在电脑上运行程序便会捕捉到程序的异常,这对

关于微信小程序下拉出现三个小点

包子这天看美团外卖的小程序,再瞅瞅自己的背景色,发现,美团下拉的时候有三个小点,但是我自己的校车徐下拉的时候没有三个小点,很是郁闷,于是各种的找各种的找,发现,这三个小点是微信小程序自带的,你只需要设置一下全局的背景色就ok了,设置全局的背景色在app.json里面设置就行,记住,是设置这个属性backgroundColor,不是这个属性:navigationBarBackgroundColor.....谨记谨记......这个定位我在上次说过了,接了百度地图的api.....

电脑木马的三个小命令

一.检测网络连接 如果你怀疑自己的计算机上被别人安装了木马,或者是中了病毒,但是手里没有完善的工具来检测是不是真有这样的事情发生,那可以使用Windows自带的网络命令来看看谁在连接你的计算机. 具体的命令格式是:netstat -an这个命令能看到所有和本地计算机建立连接的IP,它包含四个部分——proto(连接方式).local address(本地连接地址).foreign address(和本地建立连接的地址).state(当前端口状态).通过这个命令的详细信息,我们就可以完全监控计算机

寻找水王2——寻找三个小水王

一.实验题目 二.实现方法及设计思路 三.实验代码 //data:2016.5.27 #include<iostream> #include<string> #include<fstream> using namespace std; void getArray(string a[]) { string strTemp; //获取文件中第一个字符,判断文件是否为空 cout << "读取帖子列表可得:" << endl; fs

II7.0 发布 MVC 4.0 三个小问题记录

原文:II7.0 发布 MVC 4.0 三个小问题记录 1,403.14-Forbidden Web 服务器被配置为不列出此目录的内容 根据提示更改:使用 IIS 管理器启用目录浏览. 打开 IIS 管理器. 在"功能"视图中,双击"目录浏览". 在"目录浏览"页上,在"操作"窗格中单击"启用". 但是改完之后问题依旧,网上又找到说更改web.config节点内容: 1 <system.webServ

Python爬虫——第一个小爬虫01

Python小爬虫——贴吧图片的爬取 在对Python有了一定的基础学习后,进行贴吧图片抓取小程序的编写. 目标: 首先肯定要实现图片抓取这个基本功能 然后要有一定的交互,程序不能太傻吧 最后实现对用户所给的链接进行抓取 一.页面获取 要让python可以进行对网页的访问,那肯定要用到urllib之类的包.So先来个 import urllib urllib中有 urllib.urlopen(str) 方法用于打开网页并返回一个对象,调用这个对象的read()方法后能直接获得网页的源代码,内容与

C语言基础课程 第一课 Linux环境配置小实战httpserver

?? C语言基础课程 第一课 Linux环境配置小实战httpserver 首先环境需要的是redhat虚拟机操作系统 打开redhat 防火墙 2.将WWW(HTTP)勾选上 3.点击apply 点击是 4.切换到root用户 输入正确的root密码 5. 启动http服务 6.输入ifconfig 查看当前ip 痛 7.通过分析我们知道 他是一个局域网的ip   windows可以通过net 或者 主机模式与Linux进行通信 如果不想改变本地ip地址的话  我们需要改变虚拟机的ip地址 和

新入手体验:三个小实验

新入手体验:三个小实验 一:一个LED闪烁 控制要求:1个LED灯,每隔50ms闪烁一次 实物连接图: 控制代码: 1 //2018.6/11 2 3 int LED = 10;//定义数字接口10,对应 4 5 void setup() 6 7 { 8 9 pinMode(LED,OUTPUT);//设置数字10 口为输出接口,Arduino 上我们用到的I/O 口都要进行类似这样的定义. 10 11 } 12 13 14 15 void loop() //死循环体 16 17 { 18 19

HTML横向滚动条和文本超出显示三个小圆点

我们这次要说的就是:现在有很多的公司以及很多的app软件经常使用的两个方法横向滚动条和文本超出三个小圆点 横向滚动条:顾名思义嘛,就是能够一块内容可以横着滑动. 文本超出三个小圆点:文本超出就是当文本的内容超出了我们的所定的盒子宽度,我们将多余的文本隐藏替换成i小圆点进行显示. 自己刚才写了一个简单横向滚动条的例子,我们看一下代码 html部分: <div class="top"> <div class="box_top"> <span