准备工作
python基础入门
https://www.liaoxuefeng.com/wiki/1016959663602400
jupyter notebook自动补全代码
https://www.jianshu.com/p/c3c2bfbc3fa0
request_html是python3里面的包,python2不能使用
https://stackoverflow.com/questions/53373999/modulenotfounderror-no-module-named-requests-html
pycharm中导入第三方包
https://blog.csdn.net/u014028063/article/details/80423009
用python爬取数据(pyhton2)
网络爬虫就是自动的从互联网上获取数据的程序。基本上我们在浏览网站时所能见到的数据都可以通过爬虫程序保存下来。我们可以学习爬虫来获取相关的数据。但是,数据是有归属的,并不是你想拿来用就拿来用的,所以,我们要在合法的情况下使用爬虫。因此,我们要遵守互联网世界的robot协议。引用自爬虫简介
https://blog.csdn.net/IT_XF/article/details/82184585
1.requests抓取静态网页
import requests
from lxml import etree
aaa=requests.get("https://blog.csdn.net/IT_XF/article/details/82184585")
bbb=etree.HTML(aaa.text)
ccc=aaa.xpath('//*[@id="content_views"]/p/text()')
for each in bbb:
print (each)
根据以上代码爬取网页中的text内容
2. 模拟登陆
参考资料:
https://www.cnblogs.com/chenxiaohan/p/7654667.html
https://www.cnblogs.com/xinyangsdut/p/7627047.html
(1)获取浏览器里的cookie字符串
服务器利用cookie来区分不同的客户端,当服务器一下子收到好几个请求时,是无法判断出哪些请求是同一个客户端发起的,所以cookie是为了向客户端向服务器证明:“我是刚才登录过的那个客户端”。这意味着,只要得到了别的客户端的cookie,我们就可以假冒成它来和服务器对话。
通过抓包拿到cookie,再将cookie放到请求之中发送请求:
- 获取当前网页的cookie
- python中构建一个包含已登录用户cookie的headers信息,headers中这个Cookie是保存了密码无需重复登录的用户的Cookie,里面记录了用户名及密码等登录信息
- 通过headers里的报头信息(主要是Cookie信息),构建Request对象(python2)
- 直接访问目标主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户,并返回相应的页面
- 打印响应内容
实现
# -*- coding: utf-8 -*-
#python2
import urllib2
aaa={"cookie":'在浏览器中找到的目标网址的cookie'}
url='https://i.csdn.net/#/uc/profile'
bbb=urllib2.Request(url,headers=aaa)
ccc=urllib2.urlopen(bbb).read()
print ccc
#python2
import requests
aaa={"cookie":'在浏览器中找到的目标网址的cookie'
ccc=requests.get(bbb,headers=aaa)
print ccc.text
(2)
上面的方式固然可行,但是却过于麻烦,我们先需要在浏览器登录账户,并且设置保存密码,并且通过抓包才能获取这个Cookie。下面尝试使用session。
session是会话的意思。和cookie的相似之处在于,它也可以让服务器“认得”客户端。简单理解就是,把每一个客户端和服务器的互动当作一个“会话”。既然在同一个“会话”里,服务器自然就能知道这个客户端是否登录过。
- 创建session对象,可以保存Cookie值
- 处理 headers
- 需要登录的用户名和密码
- 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
- session包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
- 打印响应内容
( 3).使用Selenium和PhantomJS模拟登录
上面的两种是用的request,requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,这是他的不足之处。
下面我们使用selenium来处理上面问题
selenium模块本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器;(由于selenium解析执行了CSS、JavaScript所以相对requests它的性能是低下的;)
- 安装selenium
- 下载chromdriver.exe放置python安装路径/scripts目录下
- 写代码
import time
import selenium
aaa=webdriver.Chrome() #生成chrome浏览器对象
#bbb=WebDriverWait(aaa,10) #浏览器加载完毕的最大等待时间,设置为10秒
try:
aaa.get('https://www.baidu.com/') #打开百度网页
ccc=aaa.find_element_by_id("kw")
ddd=ccc.send_keys('张根硕')
eee_button=aaa.find_element_by_id('su')
eee_button.click()
print(aaa.page_source)
#wait.until(EC.presence_of_element_located((By.ID,'4')))
finally:
time.sleep(100)#页面存在的时长100s
aaa.close()
3.使用selenum动态爬虫
参考:
https://www.cnblogs.com/mengyu/p/6876294.html
4.静态爬取网页并输入到csv
利用urlib库,以及csv库+BeautifulSoup
# -*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup
import csv
import codecs
#i = 1
#while i<5:
# print "爬取第" + str(i) + "页"
c =open("test.csv","wb")
c.write(codecs.BOM_UTF8)
comin=csv.writer(c)
comin.writerow(['职位','简历','分工','发布时间'])
url = "http://www.hubei.gov.cn/2018/gov/"
#print url
content = urllib.urlopen(url).read()
soup = BeautifulSoup(content, "html.parser")
#print soup.title.get_text()
num = soup.find_all("div",class_="image_container")
for image in num:
con = n.get_text()
num2 =image.find_all("a")
for links in num2:
her=links.get("href")
newcontent=urllib.urlopen(her).read()
newsoup=BeautifulSoup(newcontent,"html.parser")
newnumcon=newsoup.find("div",class_="col-xs-12 col-md-left xs_nopad_md_pad")
aaa=newnumcon.get_text()
bbb=newnumcon.find("div",class_="block_content").find("a")
ccc=bbb.get("href")
#print ccc
jianliweb=urllib.urlopen(ccc).read()
jianlisoup=BeautifulSoup(jianliweb,"html.parser")
jianlicontent=jianlisoup.find("div",class_="TRS_Editor")
jianlicontent1=jianlicontent.get_text()
jianlitime=jianlisoup.find("ul",class_="list-unstyled list-inline").find("span")
jianlitime1=jianlitime.get_text()
print jianlitime1
csvnum=aaa.split()
print csvnum[0],csvnum[2],csvnum[5]
templist=[]
csvnum[0]=csvnum[0].encode('utf-8')
csvnum[2]=csvnum[2].encode('utf-8')
csvnum[5]=csvnum[5].encode('utf-8')
jianlicontent1=jianlicontent1.encode('utf-8')
jianlitime1=jianlitime1.encode('utf-8')
templist.append(csvnum[0])
templist.append(jianlicontent1)
templist.append(csvnum[5])
templist.append(jianlitime1)
comin.writerow(templist)
c.close()