Python简易爬虫初探

序言:

上大学后接触了点python并尝试学习写简单爬虫,自己稍微整理了一些总结和外链,当个记录,便于复制粘贴。

主要内容:

  • python基础
  • python爬虫基础
    • 简易爬虫逻辑及方法论
    • 案例
    • 拓展

Python基础:

参考以下教程掌握python语法基础

简明python教程
w3school的python教程
廖雪峰的python教程

Python爬虫基础:

简易爬虫的逻辑及方法论

我们可以把简易爬虫的工作过程分为:

  1. 获取网页源码
  2. 筛选网络资源
  3. 保存筛选资源

其中:

  1. 获取网页源码的方法
    • 利用urllib模块
    • 利用requests模块
  2. 筛选网络资源的方法
    • 正则表达式
    • BeautifulSoup
    • xpath
  3. 保存筛选资源的方法
    • 利用python文件操作写入本地或文件
    • 利用urllib模块中的urlretrieve函数下载
    • 用MySQLdb等模块写入相应数据库

案例

例1:爬壁百度图片纸小正则 + urllib with py2.7)
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
# -*-coding:utf-8-*-
# python2.7

import urllib2
import urllib
import re

def getHtml(url):
page=urllib2.urlopen(url)
html=page.read()
return html

def getImg(html):
reg='"objURL":"(.*?)",'
imgre=re.compile(reg)
imglist=re.findall(imgre, html)
x=1
for imgurl in imglist:
print "正在下载第",x,"张图片:"
print imgurl
urllib.urlretrieve(imgurl, 'C:\SpiderTest\P%s.jpg' % x)
x=x+1

keyword=input("Please input your keyword:\n")
html = getHtml("http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="+keyword+"&ct=201326592&lm=-1&width=1920&height=1080&v=flip")
getImg(html)
例2:爬百度图片壁纸(正则 + requests with py3.6)

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
#-*- coding:utf-8 -*-
# pyrthon3.6 project
import re
import requests

keyword=input("Input your keywords of image:\n")

url='http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+keyword+'&ct=201326592&lm=-1&width=1920&height=1080&v=flip'

html = requests.get(url).text

reg='"objURL":"(.*?)",'
pic_url = re.findall(reg,html,re.S)
i = 0
for each in pic_url:
print(each)
try:
pic= requests.get(each, timeout=5)
except requests.exceptions.ConnectionError:
print("timeout!")
continue
string = 'C:/SpiderTest/ImgSpider/Image'+str(i) + '.jpg'
fp = open(string,'wb')
fp.write(pic.content)
fp.close()
i += 1

例3:爬游迅网图片(bs4 + urllib with py2.7)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*-coding:utf-8-*-
# python2.7 project
import urllib2
import urllib
import re
from bs4 import BeautifulSoup

page=urllib2.urlopen("http://pic.yxdown.com/list/0_0_1.html")
html=page.read()
soup = BeautifulSoup(html)
x=0
for all_tag in soup.find_all('img'):
pic_link = all_tag.get('src')
print pic_link
print "正在下载第",x,"张图片"
if(x!=0):
urllib.urlretrieve(pic_link, 'C:\SpiderTest\P%s.jpg' %x)
x+=1

例4:爬某“神仙打架”游戏 的最新几条评论(正则 + requests + lxml with py3.6)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: utf-8 -*-
import re
import requests
from lxml import etree

url="http://steamcommunity.com/app/578080/reviews/?browsefilter=toprated&snr=1_5_reviews_"
header={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
'Accept-Language':'zh-CN,zh;q=0.9'
}#①

html=requests.get(url,headers=header).text
f=open("C:/SpiderTest/pubg.doc","w",encoding='utf-8')#②

HTML=etree.HTML(html)

content=HTML.xpath('//div[@class="apphub_CardTextContent"]/text()')
#author=re.findall('><a href="http://steamcommunity.com/id/(.*?)/a>',html,re.S)#③
for res in content:
f.write(res)

f.close()

其中:

  1. 为保证访问的steam国区评论区,将header请求头设置来源为中国,header获取方式参考chrome开发工具使用方法
  2. 文件操作时设置编码为“utf-8”,参考廖雪峰的编码教程

效果如下:
神仙打架
嗯,是神仙打架没错,代表我们成功爬取了神仙打架的近几条评论。


Python爬虫拓展

  1. Scrapy爬虫框架官方中文教程
  2. 简书Scrapy爬去豆瓣书单案例教程

`