说明一下 这个文章博主会持续更新的。

主要是分享一些博主自己写的一些爬虫和网上其他博主分享的爬虫,。

有错误的地方 欢迎加联系方式一起交流。

更新一

爬虫实现在‘必应’上搜索和页面的保持

这个小案例 主要使用的是urllib库的相关比较基础的的知识,适合初学者玩

代码可以直接运行

urllib import request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from urllib import parse

def get_url(word):
url = 'https://cn.bing.com/search?{}'
#此处使用urlencode()进行编码
params = parse.urlencode({'q' : '菜鸟'})
url = url.format(params)
return url
#发请求,保存本地文件
def request_url(url,filename):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
req = request.Request(url=url,headers=headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
#这里要注意这个编码格式 不然有可能回出现一堆乱码
with open(filename,'w',encoding='utf-8') as f:
f.write(html)

word = input('请输入搜索内容:')
url = get_url(word)
filename = word + '.html'
request_url(url,filename)
爬取百度贴吧

这是爬的一个静态的网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from urllib import request,parse
import time
import random
from ua_info import ua_list #使用自定义的ua池

class TiebaSpider(object):
def __init__(self):
self.url='http://tieba.baidu.com/f?{}'

def get_html(self,url):
req=request.Request(url=url,headers={'User-Agent':random.choice(ua_list)})
res=request.urlopen(req)
html=res.read().decode("gbk","ignore")
return html

def save_html(self,filename,html):
with open(filename,'w') as f:
f.write(html)

def run(self):
name=input('请输入贴吧名:')
begin=int(input('输入起始页:'))
stop=int(input('输入终止页:'))
for page in range(begin,stop+1):
pn=(page-1)*50
params={
'kw':name,
'pn':str(pn)
}
#拼接URL地址
params=parse.urlencode(params)
url=self.url.format(params)

html=self.get_html(url)

filename='{}-{}页.html'.format(name,page)
self.save_html(filename,html)
#提示
print('第%d页抓取成功'%page)
#每爬取一个页面随机休眠1-2秒钟的时间,为不被抓了
time.sleep(random.randint(1,2))
#统计程序运行的时间
start=time.time()
spider=TiebaSpider()
spider.run()
end=time.time()
print('执行时间:%.2f'%(end-start)) #爬虫执行时间

更新二

爬取 豆瓣电影排行榜

这是静态网站,爬起来比较简单

主要使用了正则表达式和csv文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
from urllib import request
import random
from ua_info import ua_list
import csv
url = 'https://movie.douban.com/chart'
p = re.compile('<tr.*?title="(.*?)".*?<p class="pl">(.*?)</p>.*?/tr>',re.S)
headers = {'User-Agent':random.choice(ua_list)}
r = request.Request(url = url, headers=headers)
res = request.urlopen(r)
response = res.read().decode('utf-8')
# print(response)
# print(p.findall(response))
w =p.findall(response)
with open( 'doupan.csv','w',newline='',encoding="utf-8") as f:
spamwriter = csv.writer(f, delimiter=' ',quotechar='|')
spamwriter.writerow(['电影','上映时间和演员'])
spamwriter.writerows(w)

爬取 一页豆瓣电影排行top250电影名

也是一个静态网站 属于基础操作系列

如果想爬取整个top250 也比较简单

先观察一下上面每一页的url的特征 ,再做出一定的更改就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
from lxml import etree

class Spider_douban:
def __init__(self):
self.url='https://movie.douban.com/top250'
self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}

def requ(self):
html = requests.get(url = self.url, headers=self.headers).text
p = etree.HTML(html)
pa = '//a/img/@alt'
pb = str(p.xpath(pa))
with open('xiaoyang.txt','w',encoding='utf-8') as f:
f.write(pb)
def run(self):
self.requ()

a = Spider_douban()
a.run()
爬取百度图片

注意 博主这里用的是 以前翻页式的百度图片网站 。

这里使用的是requests库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import requests
import re
from urllib import parse
import os

class BaiduImageSpider(object):
def __init__(self):
self.url = 'https://image.baidu.com/search/flip?tn=baiduimage&word={}'
self.headers = {'User-Agent':'Mozilla/4.0'}

# 获取图片
def get_image(self,url,word):
#使用 requests模块得到响应对象
res= requests.get(url,headers=self.headers)
# 更改编码格式
res.encoding="utf-8"
# 得到html网页
html=res.text
print(html)
#正则解析
pattern = re.compile('"hoverURL":"(.*?)"',re.S)
img_link_list = pattern.findall(html)
#存储图片的url链接
print(img_link_list)

# 创建目录,用于保存图片
directory = 'D:/File/All/python/spider/image/{}/'.format(word)
# 如果目录不存在则创建,此方法常用
if not os.path.exists(directory):
os.makedirs(directory)

#添加计数 D:\File\All\python\spider\爬虫.html
i = 1
for img_link in img_link_list:
filename = '{}{}_{}.jpg'.format(directory, word, i)
self.save_image(img_link,filename)
i += 1
#下载图片
def save_image(self,img_link,filename):
html = requests.get(url=img_link,headers=self.headers).content
with open(filename,'wb') as f:
f.write(html)
print(filename,'下载成功')

# 入口函数
def run(self):
word = input("您想要谁的照片:")
word_parse = parse.quote(word)
url = self.url.format(word_parse)
self.get_image(url,word)


spider = BaiduImageSpider()
spider.run()