python爬取淘宝信息,第三方库批量安装
今天在写代码时,发现之前有好多都忘记了。就复习总结了一下。
python——目前计算机最热门的计算机语言之一。人们大多都认为这是一门很好入门的语言,确实如此。但,入坑容易,出坑难。python就是一部伤心泪。好了,不废话。爬虫开始:
爬虫要想运行,少不了第三方库,爬虫的第三方库中,更是逐年递增。各种库其实到最后不过大同小异,各有优异,都是进行数据采集。第三方库太多了,我又懒得一个一个去慢慢安装,所以,方法如下:
第一种:在键盘上按住win+R,输入cmd命令行,回车。再输入:pip instell
第三方库名,回车即可等待。如果无法安装pip命令一般是python文件不全,重新安装python。以下是两个爬虫最基本的第三方库
EG:pip install requests
OR
pip install BeautifulSoup4
这只是第一种常用方法,第二种用python代码批量安装。代码如下
import os #引入os
libs = {"numpy","matplotlib","pillow","sklearn","requests",\
"jieba","beautifulsoup4","wheel","networkx","sympy",\
"pyinstaller","django","flask","werobot","pyqt5",\
"pandas","pyopengl","pypdf2","docopt","pygame"} #这里面都是python第三方库的名称
try:
for lib in libs:
os.system("pip3 install "+lib) #python命令格式
print("Successful")
except:
print("Failed Somehow")
如果需要安装其他库,只需更改第三方库的名称即可。
以下就是python爬取淘宝的信息代码,但我发现淘宝需要用chrome浏览器运行时,需扫码登陆账号,这是反爬代码。虽然网上有很多反爬技术,但我目前没找到比较简洁的python反爬代码,所以就不多做赘述了。另外,我的python用的是chrome浏览器的chrome driver驱动,所以,如果浏览器有差异,请另安装驱动,相关代码如下:
安装
pip install selenium
下载浏览器驱动
火狐浏览器驱动,其下载地址是:https://github.com/mozilla/geckodriver/releases
谷歌浏览器驱动,其下载地址是:http://chromedriver.storage.googleapis.com/index.html
opera浏览器驱动,其下载地址是:https://github.com/operasoftware/operachromiumdriver/releases
对照自己电脑安装的浏览器和对应的版本,分别从上面的地址下载驱动文件,下载解压后,将所在的目录添加系统的环境变量中。当然你也可以将下载下来的驱动放到python安装目录的lib目录中,因为它本身已经存在于环境变量(我就是这么干的)。
使用python代码模拟浏览器行为
要使用selenium先需要定义一个具体browser对象,这里就定义的时候就看你电脑安装的具体浏览器和安装的哪个浏览器的驱动。这里以chrome浏览器
为例,
模拟打开B站首页
from selenium import webdriver
import time
# 自动运行浏览器
browser = webdriver.Chrome("C:\\Users\\02\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe")
# 自动打开页面
browser.get('https://www.baidu.com')
time.sleep(4)
browser.execute_script("window.open('https://www.bilibili.com/')")
模拟滚动条滚动到底部
from selenium import webdriver
import time
# 自动运行浏览器
browser = webdriver.Chrome("C:\\Users\\02\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe")
#自动滚动页面
browser.get('https://www.36kr.com')
for _ in range(4):
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(1)
模拟自动搜索内容
from selenium import webdriver
import time
# 自动运行浏览器
browser = webdriver.Chrome("C:\\Users\\02\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe")
#自动搜索内容
browser.get('https://www.baidu.com')#此处选择用什么引擎搜索
search_box = browser.find_element_by_id('kw')#搜索框的标签
search_box.send_keys('python')#此处字符串输入要搜索的内容
submit_button = browser.find_element_by_id('su')#搜索引擎的标签
submit_button.click()
最后爬取淘宝信息
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from urllib.parse import quote
from pyquery import PyQuery
KEYWORD = 'iPad'
# browser = webdriver.Opera("D:\\Operade\\operadriver_win64\\operadriver.exe")
browser = webdriver.Chrome("C:\\Users\\02\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe")
wait = WebDriverWait(browser,10)
#打开某一个页面
def crawl_page(page):
try:
url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
browser.get(url)
if page>1:
page_box = wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR,'.J_Input')
)
)
submit_button = wait.until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR,'.J_Submit')
)
)
page_box.clear()
page_box.send_keys(page)
submit_button.click()
wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR,'.m-itemlist .items .item')
)
)
get_products()
except:
crawl_page(page)
#将已经打开的页面的内容存储
def get_products():
html = browser.page_source
doc = PyQuery(html)
items = doc('#mainsrp-itemlist .m-itemlist .items .item').items()
for item in items:
product = {
'title':item.find('.title').text(),
'image':item.find('.img').attr('data-src'),
'price':item.find('.price').text(),
'deal-cnt':item.find('.deal-cnt').text(),
'shopname':item.find('.shopname').text(),
'location':item.find('.location').text(),
'url':item.find('.title a').attr('href')
}
print(product)
crawl_page(1)
这是笔者一周学习爬虫的小结,仅做总结。当然,注释太多了,懒得写!!!
以下是优化版
import os
import re
import xlwt
import sqlite3
import requests
from win32.win32crypt import CryptUnprotectData
def getcookiefromchrome():
host = '.taobao.com'
cookies_str = ''
cookiepath=os.environ['LOCALAPPDATA']+r"\Google\Chrome\User Data\Default\Cookies"
sql="select host_key,name,encrypted_value from cookies where host_key='%s'" % host
with sqlite3.connect(cookiepath) as conn:
cu=conn.cursor()
cookies={name:CryptUnprotectData(encrypted_value)[1].decode() for host_key,name,encrypted_value in cu.execute(sql).fetchall()}
for key,values in cookies.items():
cookies_str = cookies_str + str(key)+"="+str(values)+';'
return cookies_str
def writeExcel(ilt,name):
if(name != ''):
count = 0
workbook = xlwt.Workbook(encoding= 'utf-8')
worksheet = workbook.add_sheet('temp')
worksheet.write(count,0,'序号')
worksheet.write(count,1,'购买')
worksheet.write(count,2,'价格')
worksheet.write(count,3,'描述')
for g in ilt:
count = count + 1
worksheet.write(count,0,count)
worksheet.write(count,1,g[0])
worksheet.write(count,2,g[1])
worksheet.write(count,3,g[2])
workbook.save(name+'.xls')
print('已保存为:'+name+'.xls')
else:
printGoodsList(ilt)
def getHTMLText(url):
cookies = getcookiefromchrome()
kv = {'cookie':cookies,'user-agent':'Mozilla/5.0'}
try:
r = requests.get(url,headers=kv, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
sls = re.findall(r'\"view_sales\"\:\".*?\"',html)
for i in range(len(plt)):
sales = eval(sls[i].split(':')[1])
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([sales , price , title])
except:
print("")
def printGoodsList(ilt):
tplt = "{:4}\t{:8}\t{:16}\t{:32}"
print(tplt.format("序号", "购买","价格", "商品名称"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1],g[2]))
def main():
goods = input('搜索商品:')
depth = int(input('搜索页数:'))
name = input('输入保存的excel名称(留空print):')
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
print('处理中...')
for i in range(depth):
try:
url = start_url + '&s=' + str(44*i)
html = getHTMLText(url)
parsePage(infoList, html)
print('第%i页成功...' %(i+1))
except:
continue
writeExcel(infoList,name)
print('完成!')
main()
为他导了三个库! 我总觉得还有很大的可以优化的空间。 而且这个是针对Chrome的cookies缓存位置, pywin32我装了好久才成功,它在sublime里还会一直报错,虽然运行不影响。