因为本人先前已经成功安装selenium,所以这里提示“已经安装成功”,当然要使用pip命令,必须提前安装pip,自行百度,用户安装完上面的所有工具后我们就可以开始本期的装逼之旅了。
第一步、查看www.1688.com网页,确定抓取范围。我们打开阿里巴巴采购首页,我们发现阿里巴巴提供了厂商的搜索接口,如下所示:
第二步、我们试着搜索“化工”,查看得到的结果,如下:
第三步、我们可以看到,我们要的基本信息都存在了,但是联系方式没有,我们任意打开一个厂商的页面,可以看到“联系”这个导航栏项目,点击联系,就可以看到厂商的联系方式,我们在将注意力放到网址url上,我们可以看到,联系这个页面的URL呈现规律性,如www.xxx.1688.com/page/contactinfo.htm,并且联系电话的位置是最前的,这极大地方便了我们采集我们想要的信息,如下:
第四步、啰嗦了那么多,直接开始我们的代码:
首先使用python的selenium包打开一个Firefox浏览器窗口:
1
2
3
4
5
6
7
8
9
#! /usr/bin/env python
#coding:utf-8
from selenium import webdriver
import sys
# 解决中文报错的问题
reload(sys)
sys.setdefaultencoding('utf-8')
driver = webdriver.Firefox()
以上程序就可以打开Firefox浏览器窗口,并且打开的浏览器窗口对象为driver,接下来我们模拟登录,找到阿里巴巴模拟登录的地址为,我们通这个地址模拟登录,并通过selenium的find_element_by_name方法获取网页中的DOM节点,有学过JavaScript的同学应该就会了解DOM节点,具体的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
url = '
k.635.1998096057.d1'
loginUrl = 't=true&redirect_url=
3Dlogin_target_is_blank_1688%26tracelog%3Dmember_signout_signin_s_reg'
driver = webdriver.Firefox()
time.sleep(3)
driver.get(loginUrl)
time.sleep(5)
driver.find_element_by_name("TPL_username").send_keys('这里是你的淘宝账号')
driver.find_element_by_name("TPL_password").send_keys('这里是你的淘宝密码')
driver.find_element_by_name("TPL_password").send_keys(Keys.ENTER)
time.sleep(5)
driver.get(url)
模拟登录成功后我们让页面自动跳转到我们刚才搜索“化工”厂商的那个页面,其中使用了time包里的sleep函数,是为了防止在网速较差的时候,网页加载速度较慢,源码还未下载完毕就执行查找节点的命令导致程序运行失败。接下来我们要做的是查找厂商的主页并找到其联系方式,并且发现厂商找到的结果共有100页,在这里,为了使用方便,我们直接使用for循环来模拟点击下一页进行采集。具体的所有源代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#! /usr/bin/env python
#coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
import urllib
import urllib2
import sys
import os
import re
import csv
import numpy as np
# 解决中文报错的问题
reload(sys)
sys.setdefaultencoding('utf-8')
csvfile = file('data.csv', 'wb')
writer = csv.writer(csvfile)
writer.writerow((u'企业名称'.encode('gbk'), u'主页'.encode('gbk'), u'产品'.encode('gbk')
, u'联系人'.encode('gbk'), u'电话'.encode('gbk'), u'地址'.encode('gbk')))
url = '
635.1998096057.d1'
loginUrl = '
full_redirect=true&redirect_url=
_is_blank_1688%26tracelog%3Dmember_signout_signin_s_reg'
driver = webdriver.Firefox()
time.sleep(3)
driver.get(loginUrl)
time.sleep(5)
driver.find_element_by_name("TPL_username").send_keys('这里输入你的淘宝账号')
driver.find_element_by_name("TPL_password").send_keys('这里输入你的淘宝密码')
driver.find_element_by_name("TPL_password").send_keys(Keys.ENTER)
time.sleep(5)
driver.get(url)
time.sleep(15)
user_agents = [
'Mozilla/5.0 (WindowsUWindows NT 5.1itrv:1.8.1.11) Gecko/20071127 Firefox/2.
0.0.11',
'Opera/9.25 (Windows NT 5.1Uen)',
'Mozilla/4.0 (compatibleMSIE 6.0Windows NT 5.1SV1.NET CLR 1.1.4322.NET CLR
2.0.50727)',
'Mozilla/5.0 (compatibleKonqueror/3.5Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
'Mozilla/5.0 (X11ULinux i686en-USrv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-se
curity Firefox/1.5.0.12',
'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
"Mozilla/5.0 (X11Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chr
omium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
"Mozilla/5.0 (X11UbuntuLinux i686rv:10.0) Gecko/20100101 Firefox/10.0 ",
]
for page in xrange(1, 100):
try:
title = driver.find_elements_by_css_selector("a[class=list-item-title-text]")
product = driver.find_elements_by_xpath("//div[@class=\"list-item-detail\"]/div[1]
/div[1]/a[1]")
print len(title)
pattern = re.compile('<div class="contcat-desc".*?>(.*?)</div>', re.S)
telPattern = re.compile('<dd>(.*?)</dd>', re.S)
membernamePattern = re.compile('<a.*?class="membername".*?>(.*?)</a>', re.S)
addressPattern = re.compile('"address">(.*?)</dd>', re.S)
for i in xrange(len(title)):
titleValue = title[i].get_attribute('title')
hrefValue = title[i].get_attribute('href') + 'page/contactinfo.htm'
productValue = product[i].text
agent = np.random.choice(user_agents)
headers = {'User-Agent' : agent, 'Accept' : '*/*', 'Referer' : ''}
request = urllib2.Request(hrefValue, headers=headers)
response = urllib2.urlopen(request)
html = response.read()
info = re.findall(pattern, html)
try:
info = info[0]
except Exception, e:
continue
tel = re.findall(telPattern, info)
try:
tel = tel[0]
tel = tel.strip()
tel = tel.replace(' ', '-')
except Exception, e:
continue
membername = re.findall(membernamePattern, html)
try:
membername = membername[0]
membername = membername.strip()
except Exception, e:
continue
address = re.findall(addressPattern, html)
try:
address = address[0]
address = address.strip()
except Exception, e:
address = ''
print 'tel:' + tel
print 'membername:' + membername
data = (titleValue.encode('gbk', 'ignore'), title[i].get_attribute('href'), pr
oductValue.encode('gbk', 'ignore'), membername, tel, address)
writer.writerow(data)
for t in title:
print t.get_attribute('title')
print t.get_attribute('href') + 'page/contactinfo.htm'
print len(product)
for p in product:
a = repr(p.text)
a = a.encode('gbk', 'ignore')
print a
print '#' * 50
js = 'var q=document.documentElement.scrollTop=30000'
driver.execute_script(js)
time.sleep(2)
page = driver.find_elements_by_css_selector("a[class=page-next]")
page = page[0]
page.click()
time.sleep(10)
except Exception, e:
print 'error'
continue
csvfile.close()
driver.close()
403是网页状态码,表示访问拒绝或者禁止访问。应该是你触发到网站的反爬虫机制了。
解决方法是:
1.伪造报文头部user-agent(网上有详细教程不用多说)
2.使用可用代理ip,如果你的代理不可用也会访问不了
3.是否需要帐户登录,使用cookielib模块登录帐户 *** 作
4.如果以上方法还是不行,那么你的ip已被拉入黑名单静止访问了。等一段时间再 *** 作。如果等等了还是不行的话:
使用phatomjs或者selenium模块试试。
还不行使用scrapy等爬虫框架看看。
以上都不行,说明这网站反爬机制做的很好,爬不了了,没法了,不过我觉得很少有这种做得很好的网站
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)