学习了一个月的爬虫,对爬虫的概念和思路有了一个基本了解,爬虫的基本思路是:首先获取网页源码,使用urllib,request库等;然后对网页源码进行筛选出需要的信息,使用正则表达式,BeautifulSoup库等,最常用的还是正则表达式;其次就是存储信息,可以将信息存储到excel表格,txt文件中,也可以存储到Mysql等数据库中。在学习爬虫的阶段也是对python语言的一种更深入的学习和理解,爬虫涉及很多的知识,python是最基础,还有网页,数据库等知识,如果想深入学习python,建议从爬虫入手。。。。。爬虫的入门教程:《Python 3网络爬虫开发实战 ,崔庆才著》(文末附书本下载链接),爬虫想入门,必须得自己动手多写,先模仿写后独立写,形成写自己的代码风格,切勿直接把别人的代码直接粘贴复制!!!,最后以一个教程作为本月的学习总结。
爬取淘宝上华为手机前10页信息的教程:
目标:爬取淘宝上华为手机前10页的信息(名称,价格,付款人数),并保存在excel表格中。
环境:python3.6编译器, pycharm, 谷歌浏览器
思路:获取网页源码—>正则表达式筛选—>保存到excel表格
一、获取网页源码
淘宝网有一定反爬虫的手段,如果用简单的获取网页的方式可能得不到一个真正的网页源码,需要模拟request Header请求,如何获取?使用谷歌浏览器,打开淘宝网搜索华为的页面,点击鼠标右键,选择检查选项,然后点击到‘Network’选择界面,重新加载华为的页面,最后双击第一个词条就可得到以下界面,将红色方框的内容添加到get请求headers中即可。
二、正则表达式筛选信息
我前面的文章这部分内容写的很多,也很详细,可去参考一下,此处不再详细讲解。
三、存储信息
本教程是将信息存储到excel表格中,首先创建excel表格,导入xlwt模块,inforfiile = xlwt.Workbook(),然后创建sheet1工作簿,sheet1 = inforfiile.add_sheet(u'sheet1',cell_overwrite_ok=True),最后像里面写入数据,写入数据时,要指定对应的行和列。
四、小技巧
1、方法zip():zip()是将不同的列表中的元素可以一一对应,当使用正则表达式获取到华为手机的名称、价格、付款人数后是三个列表,每个列表中元素可以一一对应,如何将其对应到一起,可以使用zip()方法。具体的使用教程自行百度。
2、翻页:首先观察三条链接:
可以观察到三条链接的不同之处,我在文中已经标出了,每页中最后s值相差44,所以可以根据这个来翻页。当然链接中还有其他的不同之处,例如bcoffset的值不同等,但这些都不是获取下一个页面的方法,可自行实验。。。文末附完整代码,仅供参考!!!
import requests
from requests.exceptions import RequestException
import re
import xlwt
from urllib.parse import urlencode
import time
def get_url(keyword, number_two):
'''
获取关键字的链接
:param keyword: 关键字
:param number_two: 不同的数值对应不同的页码,淘宝上第一页为0 ,第二页为44
第三页为88.。。。
:return: 不同页码的链接
'''
data= {
'ie': 'utf8',
'initiative_id': 'staobaoz_20180830',
'stats_click': 'search_radio_all:1',
'js': '1',
'imgfile': ' ',
'q': keyword,
'suggest': 'history_3',
'_input_charset': 'utf - 8',
'wq': ' ',
'suggest_query': ' ',
'source': 'suggest',
'bcoffset': '6',
'ntoffset': '6',
'p4ppushleft': '1, 48',
's': number_two
}
url = r'https://s.taobao.com/search?'+urlencode(data)
return url
def get_html(url):
'''
获取网页源码
注: 字典header必须要,模拟浏览器访问,如果没有,可能无法获取真正的网页源码
:param url:
:return:
'''
header = {
'authority': 's.taobao.com',
'method': 'GET',
'path': '/search?q=%E5%8D%8E%E4%B8%BA&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',
'scheme': 'https',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'max-age=0',
'cookie': 't=36cb250100b52693b17ae64bc1bfdd70; cna=VyPnE24R+BkCATutHgrsC+PV; thw=cn; enc=a3RNml%2FS%2BsGExETuWVzeQtnku9tWlLTy8SAFpvYnh8dmn1LPXEmw5YZa%2Bp6MFnSuPtZGWzYPfymeYAg6dyDCnw%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; miid=75000991625205136; _m_h5_tk=31112bbc02d3d787d370cfe5fd3623f7_1535451779885; _m_h5_tk_enc=6cf0675f1fcc9c93fc7919e3da3e79db; alitrackid=www.taobao.com; lastalitrackid=www.taobao.com; v=0; cookie2=34115b060c8e01bc8e9915cd17f750a4; _tb_token_=e761eedae8eae; JSESSIONID=C52D3D32676B70B8B9A15B9865025A9A; isg=BJubrzdiRKUI97i8-ww_luaHKv-pbq751j8AYI3YdhqxbLtOFUQQwryuAozHzAdq',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
} # 模拟浏览器访问
response = requests.get(url, headers=header)
try:
if response.status_code ==200:
return response.text
else:
return None
except RequestException:
print("页面请求错误!")
return None
def get_select(html,num_one):
row = ['名称', '价格', '销量']
reg_lect = r'"raw_title":"(.*?)"' #名称
reg_com = re.compile(reg_lect)
reg_lectlists = reg_com.findall(html, re.S)
reg_price = r'"view_price":"(.*?)"' #价格
reg_com_pri = re.compile(reg_price)
reg_pricelists = reg_com_pri.findall(html, re.S)
reg_sale = r'"view_sales":"(.*?)"' #销量
reg_com_sale = re.compile(reg_sale)
reg_salelists = reg_com_sale.findall(html,re.S)
for num in range(3):
sheet1.write(0, num, row[num]) #向excel表格里写入名称,价格等信息
infor_taobao = zip(reg_lectlists, reg_pricelists, reg_salelists)
infor_taobaos = list(infor_taobao)
print(infor_taobaos)
for huawei in infor_taobaos:
sheet1.write(num_one,0, huawei[0])
sheet1.write(num_one,1, huawei[1])
sheet1.write(num_one,2, huawei[2])
num_one+=1
print(num_one)
num_two = num_one
inforfiile.save('华为手机信息.xls')
return num_two
if __name__ == '__main__':
number = 0
num_one = 1
inforfiile = xlwt.Workbook() #创建excel表格
sheet1 = inforfiile.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheet1
while number<397:
url = get_url('华为',number)
print(url)
html = get_html(url)
number_one = get_select(html,num_one)
num_one = number_one
number+=44
time.sleep(1)