如何优雅地使用python采集阿里巴巴百万商户信息

如何优雅地使用python采集阿里巴巴百万商户信息,第1张

Sublime是一款轻量文本编辑工具,可以用来快速编写python脚本,这里就不多作介绍,详情自己百度。本期所需的工具包是selenium,用户需要自行安装,可以通过pip命令快速安装selenium,如下:

因为本人先前已经成功安装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等爬虫框架看看。

以上都不行,说明这网站反爬机制做的很好,爬不了了,没法了,不过我觉得很少有这种做得很好的网站


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11845476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存