学爬虫也有一两周了今天首次爬取快代理记录一下所遇到的问题
来啦来啦!
import time
import requests
from lxml import etree
import re
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
path = r'谷歌路径'
client = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)
headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
str_list = []
def dispose_url(get_url):
start_page = int(input('起始页码:'))
end_page = int(input('结束页码:'))
#生成url
for page in range(start_page,end_page + 1):
# print(page)
url = get_url + str(page) + '/'
request(url)
def request(url):
client.get(url)
time.sleep(2)
content_str = client.page_source
str_list.append(content_str)
def content_str(string):
IP = re.findall('(\d.*?) ', str(string))
PORT = re.findall('(\d.*?) ', str(string))
# port = len(PORT)
for x, y in zip(IP, PORT):
IP_PORT = x + ':' + y + '\n'
with open('ip_port.txt','a+') as fp:
fp.write(IP_PORT)
print('成功爬取并写入%s' %IP_PORT)
def main():
get_url = 'https://www.kuaidaili.com/free/inha/'
dispose = dispose_url(get_url)
for string in str_list:
content_str(string)
if __name__ == '__main__':
main()
爬取思路:
1,目标url
2,发起请求获取相应
3,xpath解析相应获取需要的ip and port
4,写入文件
问题来啦!!!
在实际爬取中因为不熟练遇到的问题!!!
/**/
在我获取响应的时候发现响应内容里没有ip和port所以我用xpath的时候获取到的是一个空列表
####最后的解决方案是用无头浏览器
####模拟真实访问推荐用(phantomjs,谷歌)建议谷歌
>>>ip_list = terr.xpath('//tbody[@class]/tr[@class]/td[@data-title="IP"]')[0]
>>>port_list = terr.xpath('//tbody[@class]/tr[@class]/td[@data-title="PORT"]')[0]
>>>[ ]
于是我就怀疑是通过js动态加载于是我就去捕获他 的接口令人失望的 是我竟然没找出来哪个接口(难受ing)于是请教了同届大佬无果,最后我拿出了杀手锏(无头谷歌浏览器)经过度娘的’调教’成功用上了附上用法
>>>from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
path = '路径'
client = webdriver.Chrome(executable_path=r'path',chrome_options=chrome_options)
终于拿到了ip和port不为空的数据了(开心0^0 )可是一切并没有那么顺利解决了一个问题也出现了下一个问题 ing !!
返回的数据是一个str字符串形式那就意味着用不了xpath(可怜的我只会xpath)经过我各种收集信息各种百度最后用了
正则表达式(现学现卖)###可轻喷###
参考文章
好了一切假装很顺利的亚子(内心的苦谁懂!)
最后最后
用正则成功匹配到了相应的ip和port但是得到的是两个列表一个是全部的ip一个是全部的port那我们要的
格式是ip:port可是两个列表的合并我用了很多方法都已失败告终!!最后参考了某大佬的文章解决了感谢一下…额忘了地址了…
最后如愿以偿地拿下啦!!!
##后期考虑加入多线程