python学习之爬取网页技术

这里介绍三种基本的爬取网页的技术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()

猜你喜欢

转载自blog.csdn.net/Li_peipei/article/details/82048450