这里介绍三种基本的爬取网页的技术urllib、requests、selenium
- 爬取网页时,会遇到各种不同的情况:有的网页是带有反爬虫机制的,而且有的需要登录后才能爬取,下面通过urllib的用法依次介绍各种各种情况:
首次是简单的爬取:
import urllib.request
url="https://www.csdn.net/"
response=urllib.request.urlopen(url,timeout=10)
text=response.read().decode()
print(text)
其次是需要带header的:
import urllib.request
url="http://www.cnplugins.com/"
req=urllib.request.Request(url)
req.add_header('user-agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36')
response=urllib.request.urlopen(req)
text=response.read().decode()
print(text)
如果是爬取很多页面时,这样加入头消息未免有一些麻烦,可以加入总的消息头
使用requests:
import requests
import lxml.etree
url='https://movie.douban.com/top250?start=25&filter='
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
response = requests.get(url, headers=HEADERS)
# 获取网页数据
text = response.text
#使用xpath选择器
html_tree = lxml.etree.HTML(text.encode('utf-8'))
imgURL=html_tree.xpath('//div[@class="pic"]//img/@src')
print(imgURL)
- 使用selenium可以模仿人打开浏览器进行操作:
from selenium import webdriver
from scrapy.selector import Selector
from urllib import parse
import csv
#打开的是搜狐浏览器executable_path=geckodriver.exe的路径
browser = webdriver.Firefox(executable_path=r'C:\Users\17864\Desktop\翡翠培训\python\安装包\浏览器\geckodriver.exe')
#打开的是谷歌浏览器executable_path=chromedriver.exe的路径
# browser=webdriver.Chrome(executable_path='')
pageUrl='https://s.taobao.com/search?q=%E9%9B%B6%E9%A3%9F&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306'
#吧爬取的数据存储到csc文件
csvfile=open(r'C:\Users\17864\Desktop\taobao.csv','w',newline='')
writer = csv.writer(csvfile)
writer.writerow(['名称', '价格','月销量','累计评价','地址'])
def getPage(t):
#拼接的每一页的链接
pageurl='https://s.taobao.com/search?q=%E9%9B%B6%E9%A3%9F&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset='+str(t*3)+'&ntoffset='+str(t*3)+'&p4ppushleft=1%2C48&s='+str(44*t)
print(pageurl)
# 读取网页数据
browser.get(pageurl)
# browser.page_source是网页源代码
response= Selector(text=browser.page_source)
#使用css选择器得到每个商品的具体链接
list=response.css('.pic-link.J_ClickStat.J_ItemPicA::attr(data-href)').extract()
for link in list:
#有的链接带有HTTPS,但是有的没有,使用这个方法,能够自动判断是否添加https
url=parse.urljoin('https:',link)
browser.get(url)
context=Selector(text=browser.page_source)
name=context.css('.tb-detail-hd h1::text').extract_first('')
if name=="":
name = context.css('#J_Title h3::text').extract_first('')
price = context.css('.tb-rmb-num::text').extract_first('')
saleNum = context.css('#J_SellCounter::text').extract_first('')
comment = context.css('#J_RateCounter::text').extract_first('')
address = context.css('#J-From::text').extract_first('')
else:
price=context.css('.tm-promo-price .tm-price::text').extract_first('')
saleNum=context.css('.tm-ind-item.tm-ind-sellCount .tm-indcon .tm-count::text').extract_first('')
comment=context.css('#J_ItemRates .tm-indcon .tm-count::text').extract_first('')
address=context.css('.tb-deliveryAdd::text').extract()
writer.writerow([name,price,saleNum,comment,address])
break
#为了方便运行,添加t控制了爬取的页数
if(t<3):
getPage(t+1)
getPage(0)
csvfile.close()
#退出浏览器
browser.quit()