爬虫实践

1.URL爬取

  爬取一个站点的所有URL,大概有以下步骤:

  1.确定好要爬取的入口链接。

  2.根据需求构建好链接提取的正则表达式。

  3.模拟成浏览器并爬取对应的网页。

  4.根据2中的正则表达式提取出该网页中包含的链接。

  5.过滤重复的链接。

  6.后续操作,打印链接或存到文档上。

  这里以获取 https://blog.csdn.net/ 网页上的链接为例,代码如下:

 1 import re
 2 import requests
 3
 4 def get_url(master_url):
 5     header = {
 6         ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
 7         ‘Accept-Encoding‘:‘gzip, deflate, br‘,
 8         ‘Accept-Language‘:‘zh-CN,zh;q=0.9‘,
 9         ‘Cache-Control‘:‘max-age=0‘,
10         ‘Connection‘:‘keep-alive‘,
11         ‘Cookie‘:‘uuid_tt_dd=10_20323105120-1520037625308-307643; __yadk_uid=mUVMU1b33VoUXoijSenERzS8A3dUIPpA; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1521360621,1521381435,1521382138,1521382832; dc_session_id=10_1521941284960.535471; TY_SESSION_ID=7f1313b8-2155-4c40-8161-04981fa07661; ADHOC_MEMBERSHIP_CLIENT_ID1.0=51691551-e0e9-3a5e-7c5b-56b7c3f55f24; dc_tos=p64hf6‘,
12         ‘Host‘:‘blog.csdn.net‘,
13         ‘Upgrade-Insecure-Requests‘:‘1‘,
14         ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36‘
15     }
16     patten = r‘https?://[^\s]*‘
17     requests.Encoding = ‘utf-8‘
18     response = requests.get(url=master_url,headers=header)
19     text = response.text
20     result = re.findall(patten,text)
21     result = list(set(result))
22     url_list = []
23     for i in result:
24         url_list.append(i.strip(‘"‘))#过滤掉url中的"
25     return url_list
26
27 url = get_url("https://blog.csdn.net/")
28 print(url,len(url))
29 for u in url:
30     with open(‘csdn_url.txt‘,‘a+‘) as f:
31         f.write(u)
32         f.write(‘\n‘)

打印结果:

2.糗事百科

  具体思路如下:

  1.分析网页间的网址规律,构建网址变量,并可以通过for循环实现多页面内容的爬取。

  2.构建函数,提取用户以及用户的内容。

  3.获取URL,调用函数,获取到段子。

 1 import requests
 2 from lxml import html
 3
 4 def get_content(page):
 5     header = {
 6         ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
 7         ‘Accept-Encoding‘:‘gzip, deflate, br‘,
 8         ‘Accept-Language‘:‘zh-CN,zh;q=0.9‘,
 9         ‘Cache-Control‘:‘max-age=0‘,
10         ‘Connection‘:‘keep-alive‘,
11         ‘Cookie‘:‘_xsrf=2|bc420b81|bc50e4d023b121bfcd6b2f748ee010e1|1521947174; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1521947176; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1521947176‘,
12         ‘Host‘:‘www.qiushibaike.com‘,
13         ‘If-None-Match‘:"91ded28d6f949ba8ab7ac47e3e3ce35bfa04d280",
14         ‘Upgrade-Insecure-Requests‘:‘1‘,
15         ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36‘,
16     }
17     requests.Encoding=‘utf-8‘
18     url_=‘https://www.qiushibaike.com/8hr/page/%s/‘%page
19     response = requests.get(url=url_,headers=header)
20     selector = html.fromstring(response.content)
21     users = selector.xpath(‘//*[@id="content-left"]/div/div[1]/a[2]/h2/text()‘)
22     contents = []
23     #获取每条段子的全部内容
24     for x in range(1,25):
25         content = ‘‘
26         try:
27             content_list = selector.xpath(‘//*[@id="content-left"]/div[%s]/a/div/span/text()‘%x)
28             if isinstance(content_list,list):
29                 for c in content_list:
30                     content += c.strip(‘\n‘)
31             else:
32                 content = content_list
33             contents.append(content)
34         except:
35             raise ‘该页没有25条段子‘
36     result = {}
37     i = 0
38     for user in users:
39         result[user.strip(‘\n‘)] = contents[i].strip(‘\n‘)
40         i += 1
41     return result
42 if __name__ == ‘__main__‘:
43     for i in range(1,5):
44         get_content(i)

打印结果:

3.微信公众号文章爬取

搜狗的微信搜索平台 http://weixin.sogou.com/ ,搜索Python,通过URL http://weixin.sogou.com/weixin?query=python&type=2&page=2&ie=utf8 分析搜索关键词为query,分页为page,为此已经可以构造出此次爬虫的主URL。

接下来分析文章的URL:

可以获取到文章URL的xpath://*[@class="news-box"] /ul/li/div[2]/h3/a/@href

这里大量访问很容易被封IP,所有我们在requests请求中添加了代理参数 proxies

 1 import requests
 2 from lxml import html
 3 import random
 4
 5 def get_weixin(page):
 6     url = "http://weixin.sogou.com/weixin?query=python&type=2&page=%s&ie=utf8"%page
 7     header = {
 8         ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
 9         ‘Accept-Encoding‘:‘gzip, deflate‘,
10         ‘Accept-Language‘:‘zh-CN,zh;q=0.9‘,
11         ‘Cache-Control‘:‘max-age=0‘,
12         ‘Connection‘:‘keep-alive‘,
13         ‘Cookie‘:‘SUV=1520147372713631; SMYUV=1520147372713157; UM_distinctid=161efd81d192bd-0b97d2781c94ca-454c062c-144000-161efd81d1b559; ABTEST=0|1521983141|v1; IPLOC=CN4403; SUID=CADF1E742423910A000000005AB79EA5; SUID=CADF1E743020910A000000005AB79EA5; weixinIndexVisited=1; sct=1; SNUID=E3F7375C282C40157F7CE81D2941A5AD; JSESSIONID=aaaXYaqQLrCiqei2IKOiw‘,
14         ‘Host‘:‘weixin.sogou.com‘,
15         ‘Referer‘:url,
16         ‘Upgrade-Insecure-Requests‘:‘1‘,
17         ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.3‘
18     }
19     requests.Encoding=‘utf-8‘
20     proxy_list = get_proxy()
21     #使用代理并尝试请求,直到成功
22     while True:
23         proxy_ip = random.choice(proxy_list)
24         try:
25             response = requests.get(url=url,headers=header,proxies=proxy_ip).content
26             selector = html.fromstring(response)
27             content_url = selector.xpath(‘//*[@class="news-box"] /ul/li/div[2]/h3/a/@href‘)
28             break
29         except:
30             continue
31     return content_url
32
33 def get_proxy(url=‘http://api.xicidaili.com‘):
34     requests.Encoding=‘utf-8‘
35     header = {
36         ‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
37         ‘Accept-Encoding‘:‘gzip, deflate‘,
38         ‘Accept-Language‘:‘zh-CN,zh;q=0.9‘,
39         ‘Cache-Control‘:‘max-age=0‘,
40         ‘Connection‘:‘keep-alive‘,
41         ‘Cookie‘:‘_free_proxy_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTE1MWEzNGE0MzE1ODA3M2I3MDFkN2RhYjQ4MzZmODgzBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMWZNM0MrZ0xic09JajRmVGpIUDB5Q29aSSs3SlAzSTM4TlZsLzNOKzVaQkE9BjsARg%3D%3D--eb08c6dcb3096d2d2c5a4bc77ce8dad2480268bd; Hm_lvt_0cf76c77469e965d2957f0553e6ecf59=1521984682; Hm_lpvt_0cf76c77469e965d2957f0553e6ecf59=1521984778‘,
42         ‘Host‘:‘www.xicidaili.com‘,
43         ‘If-None-Match‘:‘W/"df77cf304c5ba860bd40d8890267467b"‘,
44         ‘Referer‘:‘http://www.xicidaili.com/api‘,
45         ‘Upgrade-Insecure-Requests‘:‘1‘,
46         ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.3‘
47     }
48     response = requests.get(url=url,headers=header).content
49     selector = html.fromstring(response)
50     proxy_list = selector.xpath(‘//*[@id="ip_list"]/tr/td[2]/text()‘)
51     return proxy_list
52
53
54 if __name__ == ‘__main__‘:
55     for i in range(1,10):
56         print(get_weixin(i))

通过这个爬虫,学会了如何使用代理IP请求。

原文地址:https://www.cnblogs.com/awake006/p/8643610.html

时间: 2024-10-10 07:14:32

爬虫实践的相关文章

爬虫实践——数据存储到Excel中

在进行爬虫实践时,我已经爬取到了我需要的信息,那么最后一个问题就是如何把我所爬到的数据存储到Excel中去,这是我没有学习过的知识. 如何解决这个问题,我选择先百度查找如何解决这个问题. 百度查到的方法千万种,我先选择看得懂的文章下手,不断尝试,最后解决了问题 那么到底如何解决这个问题呢? 解决这个问题要用到三个模块分别是xlwt.xlrd和xlutils 在使用这两个模块时要先下载安装它们,我用的是pycharm编写程序,我用到的安装方法是: #在文件中导入xlwt.xlrd 和xlutils

零python基础--爬虫实践总结

网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制. 觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫小教程:https://zhuanlan.zhihu.com/p/20410446 立马学起! 主要步骤: 1.按照教程下载python.配置环境变量,学习使用pip命令.安装开发ide:pycharm 2.学习使用python发送请求获取页面 3.使用chrome开发者工具观察页面结构特征,使用b

基于nightmare的美团美食商家爬虫实践

前言美团商家页分析需要爬取的数据有(这里没有按人数爬)爬虫工具选取pysipderscrapynightmare同步任务js动态加载中断继续爬坑总结示例代码 前言 上学的时候自己写过一些爬虫代码,比较简陋,基于HttpRequest请求获取地址返回的信息,再根据正则表达式抓取想要的内容.那时候爬的网站大多都是静态的,直接获取直接爬即可,而且也没有什么限制.但是现在网站的安全越来越完善,各种机器识别,打码,爬虫也要越来越只能才行了. 前段时间有需求要简单爬取美团商家的数据,做了一些分析,实践,在这

爬虫实践---排行榜小说批量下载

一.目标 排行榜的地址:http://www.qu.la/paihangbang/ 找到各类排行旁的的每一部小说的名字,和在该网站的链接. 二.观察网页的结构 很容易就能发现,每一个分类都是包裹在: <div class="index_toplist mright mbottom"> 之中,这种条理清晰的网站,大大方便了爬虫的编写. 在当前页面找到所有小说的连接,并保存在列表即可. 三.列表去重的小技巧: 就算是不同类别的小说,也是会重复出现在排行榜的.这样无形之间就会浪费

爬虫实践---电影排行榜和图片批量下载

1.目标网址:http://dianying.2345.com/top/ 需要找到的信息:电影的名字,主演,简介,和标题图片 2.查看页面结构: 容易看到,需要的主题部分,都被包裹在‘<ul>“列表标签里, 那么简单的用bs4库找到 "<ul>" tag并迭代取出每一条“<li>”tag, 最后再从每个<li>标签里找到需要的信息即可. 3.图片下载: 在电影排行榜爬虫当中,有一项目标是:爬取每个电影的标题图, 那么如何以文本的形式爬下来

JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)

WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来实现多线程,创建链接池,自动解析网页代码获取请求链接,封装正则表达式等等. 但是如果使用框架,就不再需要考虑爬虫的逻辑,只需要专注HTML内容的解析和获取. 引用WebMagic后写一个爬虫只需要编写一个类实现PageProcessor接口,实现两个方法. 一个WebMagic例子 package

爬虫实践---悦音台mv排行榜与简单反爬虫技术应用

由于要抓取的是悦音台mv的排行榜,这个排行榜是实时更新的,如果要求不停地抓取,这将有可能导致悦音台官方采用反爬虫的技术将ip给封掉.所以这里要应用一些反爬虫相关知识. 目标网址:http://vchart.yinyuetai.com/vchart/trends?area=ML 网站结构: 上面红线圈出来的地方都是需要注意的小细节: 首先 排行榜分为,内地.港台.欧美.韩国.日本五个地区分别将其点开能够观察到url的变化为在最尾部加了一个参数:area=地区参数 很容易的就能知道参数列表:['ML

爬虫实践-爬取糗事百科网段子信息

qiushibaike.py: # 导入相应的库文件import requestsimport re # 加入请求头headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'} # 初始化列表,用于装入爬虫信息info_lists = [] # 定义获取用户性别的函数def j

【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart 难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install lxml) IDEA开发工具:PyCharm_2017.3 Python版本:Python3 期望结果:爬取出排行版歌名以及对应歌手 运行效果图: 音乐排行榜: 爬取数据结果图: 像这种简单的爬取就没必要使用Scrapy框架进行处理,是在有点大材小用,不过如果你刚开始学Scrapy的话,拿这些简单的练