> 웹 프론트엔드 > JS 튜토리얼 > 셀레늄을 사용하여 Taobao 데이터 정보 캡처

셀레늄을 사용하여 Taobao 데이터 정보 캡처

亚连
풀어 주다: 2018-06-07 15:20:09
원래의
2515명이 탐색했습니다.

이제 셀레늄을 사용하여 타오바오 제품 정보를 캡처하는 예를 공유하겠습니다. 이는 좋은 참조 가치가 있으며 모든 사람에게 도움이 되기를 바랍니다.

Taobao 페이지는 데이터를 로드하는 데 많은 js를 사용하므로 셀레늄을 사용하여 크롤링하는 것이 더 쉽습니다. 테스트 도구로 셀레늄은 주로 창 없는 브라우저 phantomjs와 함께 사용됩니다.

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

import re

from selenium import webdriver

from selenium.common.exceptions import TimeoutException

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from pyquery import PyQuery as pq

'''

wait.until()语句是selenum里面的显示等待,wait是一个WebDriverWait对象,它设置了等待时间,如果页面在等待时间内

没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,也可以说程序每隔xx秒看一眼,如果条件

成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException

1.presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')

2.element_to_be_clickable 元素可点击

3.text_to_be_present_in_element 某个元素文本包含某文字

'''

# 定义一个无界面的浏览器

browser = webdriver.PhantomJS(

 service_args=[

  '--load-images=false',

  '--disk-cache=true'])

# 10s无响应就down掉

wait = WebDriverWait(browser, 10)

#虽然无界面但是必须要定义窗口

browser.set_window_size(1400, 900)

 

def search():

 '''

 此函数的作用为完成首页点击搜索的功能,替换标签可用于其他网页使用

 :return:

 '''

 print('正在搜索')

 try:

  #访问页面

  browser.get('https://www.taobao.com')

  # 选择到淘宝首页的输入框

  input = wait.until(

   EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))

  )

  #搜索的那个按钮

  submit = wait.until(EC.element_to_be_clickable(

   (By.CSS_SELECTOR, '#J_TSearchForm > p.search-button > button')))

  #send_key作为写到input的内容

  input.send_keys('面条')

  #执行点击搜索的操作

  submit.click()

  #查看到当前的页码一共是多少页

  total = wait.until(EC.presence_of_element_located(

   (By.CSS_SELECTOR, '#mainsrp-pager > p > p > p > p.total')))

  #获取所有的商品

  get_products()

  #返回总页数

  return total.text

 except TimeoutException:

  return search()

 

def next_page(page_number):

 '''

 翻页函数,

 :param page_number:

 :return:

 '''

 print('正在翻页', page_number)

 try:

  #这个是我们跳转页的输入框

  input = wait.until(EC.presence_of_element_located(

   (By.CSS_SELECTOR, '#mainsrp-pager > p > p > p > p.form > input')))

  #跳转时的确定按钮

  submit = wait.until(

   EC.element_to_be_clickable(

    (By.CSS_SELECTOR,

     '#mainsrp-pager > p > p > p > p.form > span.J_Submit')))

  #清除里面的数字

  input.clear()

  #重新输入数字

  input.send_keys(page_number)

  #选择并点击

  submit.click()

  #判断当前页是不是我们要现实的页

  wait.until(

   EC.text_to_be_present_in_element(

    (By.CSS_SELECTOR,

     '#mainsrp-pager > p > p > p > ul > li.item.active > span'),

    str(page_number)))

  #调用函数获取商品信息

  get_products()

 #捕捉超时,重新进入翻页的函数

 except TimeoutException:

  next_page(page_number)

 

def get_products():

 '''

 搜到页面信息在此函数在爬取我们需要的信息

 :return:

 '''

 #每一个商品标签,这里是加载出来以后才会拿网页源代码

 wait.until(EC.presence_of_element_located(

  (By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))

 #这里拿到的是整个网页源代码

 html = browser.page_source

 #pq解析网页源代码

 doc = pq(html)

 items = doc('#mainsrp-itemlist .items .item').items()

 for item in items:

  # print(item)

  product = {

   'image': item.find('.pic .img').attr('src'),

   'price': item.find('.price').text(),

   'deal': item.find('.deal-cnt').text()[:-3],

   'title': item.find('.title').text(),

   'shop': item.find('.shop').text(),

   'location': item.find('.location').text()

  }

  print(product)

 

def main():

 try:

  #第一步搜索

  total = search()

  #int类型刚才找到的总页数标签,作为跳出循环的条件

  total = int(re.compile('(\d+)').search(total).group(1))

  #只要后面还有就继续爬,继续翻页

  for i in range(2, total + 1):

   next_page(i)

 except Exception:

  print('出错啦')

 finally:

  #关闭浏览器

  browser.close()

 

if __name__ == '__main__':

 main()

로그인 후 복사

위 내용은 모두를 위해 제가 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

관련 기사:

jquery 기술을 통해 돋보기 구현

Puppeteer 이미지 인식 기술을 사용하여 Baidu 인덱스 크롤러를 구현하는 방법

js를 사용하여 json을 호출하는 방법

위 내용은 셀레늄을 사용하여 Taobao 데이터 정보 캡처의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿